typeCon is package {

  type Maybe of %a is
      Nothing 
  or Just(%a);

  contract Monad over %%m of %a is {
    mcreate has type (%a) => %%m of %a;
  }

  maybeCreate has type (%a) => Maybe of %a;
  maybeCreate(a) is Just(a);

  implementation Monad over Maybe of %a default is {
    mcreate = maybeCreate;
  }

  constant(a) is mcreate(a);
  
  dbl2(X) is X%X;
  
  main () do {
    thirteen is constant(13);
    
    zero is dbl2(3);
    
    assert dbl2(3)=0;
  }
}